package com.webermagem.controller;

import java.io.Serializable;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import org.hibernate.Session;
import org.primefaces.context.RequestContext;
import org.primefaces.event.SelectEvent;

import com.webermagem.DAO.PerfilDAO;
import com.webermagem.DAO.UsuarioDAO;
import com.webermagem.model.Perfil;
import com.webermagem.model.Usuario;
import com.webermagem.model.UsuarioDataModel;
import com.webermagem.util.SessionManager;

@ManagedBean
@SessionScoped
public class UsuarioController implements Serializable {

	private static final long serialVersionUID = 1L;

	private Usuario novoUsuario = new Usuario();
	private Usuario usuario;
	private Usuario usuarioPesq = new Usuario();
	private List<Usuario> listaUsuarios;
	private List<SelectItem> listaPerfis;
	private UsuarioDataModel usuarioModel;
	private UsuarioDAO usuarioDao = new UsuarioDAO();
	private PerfilDAO perfilDao = new PerfilDAO();

	private Perfil perfilSelecionado = new Perfil();
	
	// ADICIONA
	public void adicionarUsuario(ActionEvent actionEvent) throws NoSuchAlgorithmException{
		
		novoUsuario.setPerfil(perfilSelecionado);
		
		novoUsuario.setAuthority(this.setRole(perfilSelecionado));
				
		MessageDigest md = MessageDigest.getInstance("MD5");  
		BigInteger hash = new BigInteger(1, md.digest(novoUsuario.getPassword().getBytes()));  
		novoUsuario.setPassword(hash.toString(16));  
		
		RequestContext context = RequestContext.getCurrentInstance();
		context.addCallbackParam("user", novoUsuario);
		
		FacesContext facesContext = FacesContext.getCurrentInstance();
		
		usuarioDao.save((Session)SessionManager.getSessionAttribute(facesContext, "transacao"), novoUsuario);
		
		FacesContext contextfc = FacesContext.getCurrentInstance();  
		contextfc.addMessage(null, new FacesMessage("Sucesso", "Usuario adicionado com Sucesso!"));
		
		novoUsuario = new Usuario();
		
	}
	
    public void onRowSelect(SelectEvent event) {
    	usuario = (Usuario)(usuarioModel.getRowData());
    }
    
	// ALTERA
	public void alterarUsuario(ActionEvent actionEvent) throws NoSuchAlgorithmException{
		
		usuario.setPerfil(perfilSelecionado);
		
		usuario.setAuthority(this.setRole(perfilSelecionado));
		
		MessageDigest md = MessageDigest.getInstance("MD5");  
		BigInteger hash = new BigInteger(1, md.digest(usuario.getPassword().trim().getBytes()));  
		usuario.setPassword(hash.toString(16));
		
		FacesContext facesContext = FacesContext.getCurrentInstance();
		
		usuarioDao.update((Session)SessionManager.getSessionAttribute(facesContext, "transacao"), usuario);
		FacesContext context = FacesContext.getCurrentInstance();  
		context.addMessage(null, new FacesMessage("Sucesso", "Usuario atualizado com Sucesso!"));
	}

	// EXCLUIR
	public void excluirUsuario(ActionEvent actionEvent){
		
		FacesContext facesContext = FacesContext.getCurrentInstance();
		
		usuarioDao.remove((Session)SessionManager.getSessionAttribute(facesContext, "transacao"), usuario);
		FacesContext context = FacesContext.getCurrentInstance();  
		context.addMessage(null, new FacesMessage("Sucesso", "Usuario excluido com Sucesso!"));
	}
	
	// CONSULTAR
	public void pesquisarUsuario(ActionEvent actionEvent){
		
		RequestContext context = RequestContext.getCurrentInstance();
		context.addCallbackParam("user", usuarioPesq);
		
	}
	
	// GETS E SETTERS

	public UsuarioDAO getUsuarioDao() {
		return usuarioDao;
	}

	public void setUsuarioDao(UsuarioDAO usuarioDao) {
		this.usuarioDao = usuarioDao;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public UsuarioDataModel getUsuarioModel() {
		
		FacesContext facesContext = FacesContext.getCurrentInstance();
		
		if(usuarioPesq == null ||  usuarioPesq.getUsername() == null || usuarioPesq.getUsername().equals("") ) {
			
			listaUsuarios = (List<Usuario>) usuarioDao.listOrdenado((Session)SessionManager.getSessionAttribute(facesContext, "transacao"));
			
			listaPerfis = new ArrayList<SelectItem>();
			for (Object objeto : perfilDao.list((Session)SessionManager.getSessionAttribute(facesContext, "transacao"), " from Perfil ")) {
				Perfil perfil = (Perfil)objeto;
	            listaPerfis.add(new SelectItem(perfil, perfil.getDescricao()));  
	        } 
			
		} else {
			
			listaUsuarios = usuarioDao.ListByUsername((Session)SessionManager.getSessionAttribute(facesContext, "transacao"), usuarioPesq.getUsername());
			
		}
		
		usuarioModel = new UsuarioDataModel(listaUsuarios);
		
		return usuarioModel;
		
	}

	public void setUsuarioModel(UsuarioDataModel usuarioModel) {
		this.usuarioModel = usuarioModel;
	}

	public List<Usuario> getListaUsuarios() {
		return listaUsuarios;
	}

	public void setListaUsuarios(List<Usuario> listaUsuarios) {
		this.listaUsuarios = listaUsuarios;
	}

	public Usuario getNovoUsuario() {
		return novoUsuario;
	}

	public void setNovoUsuario(Usuario novoUsuario) {
		this.novoUsuario = novoUsuario;
	}

	public Usuario getUsuarioPesq() {
		return usuarioPesq;
	}

	public void setUsuarioPesq(Usuario usuarioPesq) {
		this.usuarioPesq = usuarioPesq;
	}

	public List<SelectItem> getListaPerfis() {
		return listaPerfis;
	}

	public void setListaPerfis(List<SelectItem> listaPerfis) {
		this.listaPerfis = listaPerfis;
	}

	public Perfil getPerfilSelecionado() {
		return perfilSelecionado;
	}

	public void setPerfilSelecionado(Perfil perfilSelecionado) {
		this.perfilSelecionado = perfilSelecionado;
	}
	
	public String setRole(Perfil perfil){
		
		String role = "";
		
		String perfilAux = perfil.getDescricao().toLowerCase();
		
		if (perfilAux.trim().equals("administrador do sistema")){
			role = "ROLE_ADMIN";
		}else if (perfilAux.trim().equals("enfermeiro")){
			role = "ROLE_ENF";
		}else if (perfilAux.trim().equals("técnico em enfermagem")){
			role = "ROLE_TEC";
		}
		
		return role;
		
	}
	
}